var Professor = require('../classes/professor');
var ProfessorDAO = require('../DAO/professor.dao');
var Model = require('../models/professor.model');


function ProfessorMapper() {
    var dao = new ProfessorDAO();

    this.professorToModel = function(p, callback) {
        var m = dao.getModel();
        m.nome = p.getNome();
        m.email = p.getEmail();
        m.matricula = p.getMatricula();
        m.username = p.getUsername();
        m.password = p.getPassword();
        m.roles = p.getRoles();
        m.preferidas = p.getDisciplinasPreferidas();
        m.disciplinas = p.getDisciplinas();
        m.projetos = p.getProjetos();
        m.departamento = p.getDepartamento();
        callback(m);
    }

    this.modelToProfessor = function(m, callback) {
        if (m instanceof Array) {
            var out = [];
            m.forEach(function(i) {
                var p = new Professor();
                p.setNome(i.nome);
                p.setEmail(i.email);
                p.setMatricula(i.matricula);
                p.setUsername(i.username);
                p.setPassword(i.password);
                p.setRoles(i.roles);
                p.setDisciplinasPreferidas(i.preferidas);
                p.setDisciplinas(i.disciplinas);
                p.setProjetos(i.projetos);
                p.setId(i._id);
                p.setDepartamento(i.departamento);
                out.push(p);
            });
            callback(out);
        }
        else {
            var p = new Professor();
            p.setNome(m.nome);
            p.setEmail(m.email);
            p.setMatricula(m.matricula);
            p.setUsername(m.username);
            p.setPassword(m.password);
            p.setRoles(m.roles);
            p.setDisciplinasPreferidas(m.preferidas);
            p.setDisciplinas(m.disciplinas);
            p.setProjetos(m.projetos);
            p.setId(m._id);
            p.setDepartamento(m.departamento);
            callback(p);
        }
    }

    this.add = function(professor) {
        this.professorToModel(professor, function(m) {
            dao.add(m);
        });
    }

    //FIXME change to use the ID instead of username
    this.get = function(professor, callback) {
        var that = this; //scope hack.
        dao.get(professor, function(err, data){
            if(err) throw err;
            that.modelToProfessor(data, function(p) {
                callback(err, p);
            });
        });
    }

    this.update = function(id, professor) {
        this.professorToModel(professor, function(m) {
            dao.update(id, m)
        });
    }

    this.remove = function(professor) {
        this.professorToModel(professor, function(m) {
            dao.remove(m);
        });
    }

    this.getAll = function(callback) {
        var that = this;
        dao.getAll(function(err, all) { 
            that.modelToProfessor(all, function(all) {
                callback(err, all);
            });
        });
    }
}

module.exports = ProfessorMapper;
